﻿// era5uv2one.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// 把u，v 风计算sqrt(u2+v2)，转byte型保存。

#include <iostream>
#include "gdal_priv.h"
#include <string>
#include <vector>

using namespace std;

int main()
{
    std::cout << "Hello World!\n";
    string filename1 = "D:/codes/nii2mesh-main/src/nii2messh/nii2messh/era5-u.tif";
    string filename2 = "D:/codes/nii2mesh-main/src/nii2messh/nii2messh/era5-v.tif";
    string outname = "D:/codes/nii2mesh-main/src/nii2messh/nii2messh/era5wlen.tif";
    GDALAllRegister();
    GDALDataset* ds1 = (GDALDataset*)GDALOpen(filename1.c_str(), GA_ReadOnly);
    GDALDataset* ds2 = (GDALDataset*)GDALOpen(filename2.c_str(), GA_ReadOnly);
    int xsize = ds1->GetRasterXSize();
    int ysize = ds1->GetRasterYSize();
    int nbands = ds1->GetRasterCount();

    CPLStringList opt;
    opt.SetNameValue("COMPRESS", "Deflate");
    GDALDriver* driver = GetGDALDriverManager()->GetDriverByName("GTiff");
    GDALDataset* dsout = driver->Create(outname.c_str(), xsize, ysize, nbands, GDT_Byte, opt);

    vector<float> udata(xsize * ysize);
    vector<float> vdata(xsize * ysize);
    vector<unsigned char> outdata(xsize*ysize);
    int asize = xsize * ysize;
    for (int iband = 0; iband < nbands; ++iband) {
        ds1->GetRasterBand(iband + 1)->RasterIO(GF_Read, 0, 0, xsize, ysize, udata.data(), xsize, ysize, GDT_Float32, 0, 0, 0);
        ds2->GetRasterBand(iband + 1)->RasterIO(GF_Read, 0, 0, xsize, ysize, vdata.data(), xsize, ysize, GDT_Float32, 0, 0, 0);
        float* uptr =(float*) udata.data();
        float* vptr =(float*) vdata.data();
        unsigned char* optr =(unsigned char*) outdata.data();
        for (int it = 0; it < asize; ++it) {
            float l = sqrtf((*uptr) * (*uptr) + (*vptr) * (*vptr));
            *optr = (unsigned char)l;
            uptr++;
            vptr++;
            optr++;
        }
        dsout->GetRasterBand(iband + 1)->RasterIO(GF_Write, 0, 0, xsize, ysize, outdata.data(), xsize, ysize, GDT_Byte, 0, 0, 0);
    }
    GDALClose(ds1);
    GDALClose(ds2);
    GDALClose(dsout);
    printf("done.\n");
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
